/* 
 * File:   VistaQt.h
 * Author: laptop
 *
 * Created on 22 / desembre / 2009, 09:42
 */

#ifndef _VISTAQT_H
#define	_VISTAQT_H

#include <qt3/qapplication.h>
#include <qt3/qpainter.h>
#include <qt3/qwidget.h>
#include <qt3/qlabel.h>
#include <qt3/qtimer.h>
#include <qt3/qspinbox.h>
#include <qt3/qlineedit.h>
#include <qt3/qstring.h>
#include <qt3/qfiledialog.h>
#include <vector>
#include <math.h>
#include "qt.h"
#include "saveas.h"
#include "../Modelo/Primitiva.h"
#include "../Modelo/Punto.h"
#include "../Modelo/Linea.h"
#include "../Modelo/Rectangulo.h"
#include "../Modelo/Triangulo.h"
#include "../Modelo/Circulo.h"
#include "../Vista/Vista.h"
#include "../Modelo/Modelo.h"
#include "../Modelo/Conjunto.h"
#include "../Modelo/Historial.h"
#include "ImagenQt.h"

const int REL_WIDTH = 10;
const int REL_HEIGHT = 30;

enum MODE_ENUM
{
    DRAW,
    EDIT
};

class Lienzo : public QPainter
{
public:
    Lienzo();
    Lienzo(const QPaintDevice* pd, bool unclipped = FALSE)
            : QPainter(pd, unclipped) { };
    ~Lienzo() { };
    //Lienzo(const Lienzo& ) { };
};

class Ventana : public Form1, public Vista
{
        Q_OBJECT
public:
    Ventana();
    ~Ventana() { if(drawArea != NULL) delete drawArea; drawArea = NULL; };
    void PonerModelo(Modelo *m) { Vista::PonerModelo(m); Historial *nuevo = new Historial(m); historial.push_back(nuevo); };

    void pintaPunto(int, int);
    void pintaLinea(const QPoint&, int);
    void pintaRec(const QPoint&, int, bool selectionRect = false);
    void pintaCirc(const QPoint&, int);
    void pintaTri(const QPoint&, int);
    void pintaImage(const QPoint&);

    bool containsRect(const QRect&, const Rectangulo&);
    bool containsPunto(const QRect&, const Punto&);
    bool containsLinea(const QRect&, const Linea&);
    bool containsTri(const QRect&, const Triangulo&);
    bool containsCirc(const QRect&, const Circulo&);
    bool containsConjunto(const QRect&, const Conjunto&);
    bool containsImagen(const QRect&, const ImagenQt&);

    void pinta(bool end = false);
    void pintaVector(vector<Primitiva*> v, QPainter* , bool end = false);
    virtual void Actualizar() { update(); };
    void cargarImagenes();

    /* Eventos */
    void mousePressEvent(QMouseEvent* e);
    void mouseMoveEvent(QMouseEvent* e);
    void mouseReleaseEvent(QMouseEvent* e);
    void wheelEvent(QWheelEvent* e);
    void keyReleaseEvent(QKeyEvent* e);
   
    public slots:
        void clickCopy();
        void clickCut();
        void clickPaste();
        void clickDelete();
        void clickDup();
        void clickGroup();
        void clickUngroup();
        void clickUndo();
        void clickRedo();
        void guardar();
        void abrir();
        void setSpinBox(int);
        void openSaveAs();
        void openAbout();
        void newFile();
        void exit();


        void clickSelect() { for(int i = 0; i < 6; i++) botones[i] = false;
                            labelState -> setText("Dibujar el area de seleccion"); botones[5] = true;}
        void clickPunto() { for(int i = 0; i < 6; i++) botones[i] = false; botones[0] = true;
                            labelState -> setText("Dibujar punto");
                            MODE = DRAW;};
        void clickLinea() { for(int i = 0; i < 6; i++) botones[i] = false; botones[1] = true;
                            labelState -> setText("Dibujar linea");
                            MODE = DRAW;};
        void clickRec() { for(int i = 0; i < 6; i++) botones[i] = false; botones[2] = true;
                            labelState -> setText("Dibujar rectangulo");
                            MODE = DRAW;};
        void clickTri() { for(int i = 0; i < 6; i++) botones[i] = false; botones[3] = true;
                            labelState -> setText("Dibujar triangulo");
                            MODE = DRAW;};
        void clickCirc() { for(int i = 0; i < 6; i++) botones[i] = false; botones[4] = true;
                            labelState -> setText("Dibujar circulo");
                            MODE = DRAW;};
        void clickImage() { for(int i = 0; i < 6; i++) botones[i] = false; botones[6] = true;
                            labelState -> setText("Dibujar imagen");
                            MODE = DRAW;};

private:
    MODE_ENUM MODE;
    Lienzo* drawArea;
    bool* botones;
    int move_ini_x, move_ini_y;
    int historial_actual;
    QTimer* timer;
    vector<Historial*> historial;
};

class SaveAs : public Form3
{
    Q_OBJECT
public:
    SaveAs(Ventana* v);
    ~SaveAs() { };

public slots:
    void clickAceptar();
    void clickCancelar();
private:
    Ventana* win;
};

#endif	/* _VISTAQT_H */

